package main

import (
	"bufio"
	"fmt"
	"os"
)

func Scan_a() {
	// fmt.scan可以捕获输入的值
	var (
		a_1 string
		a_2 int
	)

	// 使用 &Var 来获取捕获到的输入值的内存位置
	// Scan返回的是两个值， 一个数量值， 一个错误值
	// 这里用 err 和count来获取两个值
	// 在输入完所有值之前， cmd窗口会一直等待
	counts, err := fmt.Scan(&a_1, &a_2)

	fmt.Printf("用户输入参数共 %d 个\n", counts)
	if err == nil {
		fmt.Printf("name=%s, age=%d", a_1, a_2)
	} else {
		fmt.Printf("用户输入错误！  %s", err)
	}
}

func Scan_ln() {
	var (
		a1 string
		a2 int
	)
	// scanln 以回车为指令 传递参数， scan以输入完所有参数为指令
	counts, err := fmt.Scanln(&a1, &a2)
	fmt.Println(counts)
	if err == nil {
		fmt.Printf("name=%s, age=%d", a1, a2)
	} else {
		fmt.Printf("用户输入错误  %s", err)
	}
}

func Scan_f() {
	var (
		a1 string
		a2 int
	)

	fmt.Print("请输入：")
	// scanf 会取到 占位符 里面的内容 但需要在输入时 跟 占位符前面的字符匹配
	// scanf 目前的BUG 如果占位符后面是与占位符相同类型的内容，则 捕获的时候会连同占位符后面的相同格式的内容一起捕获
	// 解决办法是在 占位符后面加上空格
	counts, err := fmt.Scanf("用户名%s 年龄%d", &a1, &a2)
	fmt.Println(counts)
	if err == nil {
		fmt.Printf("name=%s, age=%d", a1, a2)
	} else {
		fmt.Println("用户输入错误!!", err)
	}
}

// 这个方式可以都取一整行数据
func reader() {
	// readline有三个返回值， line isPrefix error
	// line 从 stdin中读取一行数据 将 字节集合 幻化为 字符串
	// isPrefix 的概念是 如果捕获到的内容一次性读完 则 isPrefix=false， 如果一次性读不完 则 isPrefix=true 之后继续直到读完
	// error 接受stdout的错误
	reader := bufio.NewReader(os.Stdin)
	line, isPrefix, err := reader.ReadLine()
	fmt.Println(isPrefix, string(line), err)
}
